package projet;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

import exceptions.*;

public class Operation {
	
	// attributs
	private String name;
	private float duration;
	/* liste des libelles des pieces utilisees */
	private ArrayList<String> utilise=new ArrayList<String>();
	/* ensemble des noms deja pris */
	private static HashSet<String> Names=new HashSet<String>();
	
	
	// constructeur
	/**
	 * Constructeur sans arguments pour le XML
	 */
	public Operation() {
	}
	
	/**
	 * Constructeur avec arguments
	 */
	public Operation (String n, int d) throws OpNameException{
		if (checkName(n)){
			name=n;
			duration=d;
			Names.add(n);
		}
		else{
			throw new OpNameException();
		}
	}
	
	
	// methodes
	/** verification de non existance d'une operation ayant le meme nom
	 * 	@param nom a varifier
	 *  @return true si le nom est libre
	*/
	public static Boolean checkName(String name){
		Iterator<String> it=Names.iterator();
		for(;it.hasNext();)
			if(it.next().equals(name))
				return false;
		return true;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) throws OpNameException{
		if (checkName(name)) {
			this.name = name;
		}
		else{
			throw new OpNameException();
		}
	}

	/**
	 * @param duration the duration to set
	 */
	public void setDuration(float duration) {
		this.duration = duration;
	}
	
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return the duration
	 */
	public float getDuration() {
		return duration;
	}

	/**
	 * Ajouter une piece à la liste des piece néccéssaires.
	 * @param p Nom de la piece à ajouter
	 */
	public void addPiece(String p) {
		this.utilise.add(p) ;
	}
	
	/**
	 * @return un iterateur sur les noms des pieces néccéssaires.
	 */
	public Iterator<String> iterator() {
		return utilise.iterator() ;
	}
	
	/**
	 * Pour affichage des infos du workshop
	 * @return la chaine ecrite pour decrire cet element
	 */
	public String PrintOnPanel(){
		String r="\t\tNom: "+name+"\n\t\t\tDuree: "+duration+"\n\t\t\tPieces necessaires:\n";
		Iterator<String> it=utilise.iterator();
		for (;it.hasNext();)
			r=r+"\t\t\t\t"+it.next()+"\n";
		return r;
	}
	
	/**
	 *@param stbuf la chaine de caractere precedente ou est concatene le texte xml
	 *@return la chaine de caractere resultante
	 */
	public String xml(StringBuffer stbuf){
		Iterator<String> it=utilise.iterator();
		stbuf.append(" <Operation>\n");
		stbuf.append("  <name>"+name+"</name>\n");
		stbuf.append("  <duration>"+duration+"</duration>\n");
		while(it.hasNext())
			stbuf.append("  <piece>"+it.next()+"</piece>\n");
		stbuf.append(" </Operation>\n");
		return ""+stbuf;
	}
	
	
	/**
	 * @return le nom de l'operation avec les noms des pieces néccéssaires.
	 */
	public String description() {
		/* Ecrire le nom de la piece */
		String returnedString = name +" (utilise " ;
		/* Ecrire les noms des operation entre parenthèses */
		Iterator<String> iter = iterator() ;
		while(iter.hasNext()) {
			returnedString += iter.next()+(iter.hasNext() ? "," : ") :") ;
		}
		return returnedString ;
	}
}
